
package com.yangfan.design_pattern.strategy;

import java.util.function.BiFunction;

/**
 * @description: 策略模式  实现计算 对于工资、奖金根据比例计算税率是多少
 * @author: yangfan
 * @date: Created in 2020/1/21 0021 20:25
 * @modified By:
 */
public class Calculator {

    private Double salary;
    private Double bonus;
    private BiFunction<Double,Double,Double> function;

    public Calculator(Double salary, Double bonus, BiFunction<Double,Double,Double> function) {//初始化计算器的时候就需要传入需要计算的工资以及计算策略
        this.salary = salary;
        this.bonus = bonus;
        this.function = function;
    }

    /**
     * 提供外界调用的方法
     * @return
     */
    public Double calculateTax(){
        return this.calculate();
    }

    /**
     * 计算器的计算奖金的方法 此方法不对外开放
     * @return
     */
    protected Double calculate(){
        return function.apply(salary,bonus);
    }

    public static void main(String[] args) {

        /**
         * 需要的变动时候只需要改变策略即可
         */
        //Calculator ca = new Calculator(5000D,500D,new TAXCalculateImpl());

        /**
         * 对于java 8 可以更加优雅的使用 函数式编程实现
         */

        BiFunction<Double,Double,Double> bf = (s,b) -> s * 0.1 + b * 0.15;//实现策略
        Calculator ca = new Calculator(5000D,500D,bf);//获取计算器
        System.out.println(ca.calculateTax());
    }

}